#include "AISEL.h"

AISEL_T* AISEL_t;


//************************************
// Method:    	CALCU_SAMA					//< SAMA运算函数
// Programmer:  lww
// Time:		2018/11/16
// Returns:   	bool						//< 成功：true；失败：false
// Parameter: 	Model_Base_t * arg			//< 模块参数结构体指针
// Parameter: 	float dt					//< 运算周期
// Parameter: 	bool * DI					//< 数字量输入值数组指针
// Parameter: 	bool * DO					//< 数字量输出值数组指针
// Parameter: 	bool * AI					//< 模拟量输入值数组指针
// Parameter: 	bool * AO					//< 模拟量输出值数组指针
//************************************
bool CALCU_SAMA(AISEL)(Model_Base_t* arg, float dt, bool* DI, bool* DO, float* AI, float* AO)
{
	/****************变量定义区开始**************/
	/*<<<<<定义输入变量>>>>>*/
	float AI1;						//< 输入1
	float AI2;						//< 输入2
	bool choose;					//< 选择
	/*<<<<<<<<<<<<<<<<<<<<<<*/

	/*<<<<<定义输出变量>>>>>*/
	float Output_Value = 0;			//< 输出值
	/*<<<<<<<<<<<<<<<<<<<<<<*/

	/*<<<<<定义参数变量>>>>>*/
	float rate1;	//< 速率1
	float rate2;	//< 速率2
	/*<<<<<<<<<<<<<<<<<<<<<<*/

	/*<<<<<定义中间变量>>>>>*/
	float* AlastOut;
	/*<<<<<<<<<<<<<<<<<<<<<<*/
	/****************变量定义区结束**************/

	NAME(AISEL)* Obj = (NAME(AISEL)*)arg;

	/****************变量赋值**************/
	/*<<<<<输入变量赋值>>>>>*/
	AI1 = AI[0];
	AI2 = AI[1];
	choose = DI[0];
	/*<<<<<<<<<<<<<<<<<<<<<<*/

	/*<<<<<参数变量赋值>>>>>*/
	rate1 = (float)fabs((double)Obj->Par.rate1);
	rate2 = (float)fabs((double)Obj->Par.rate2);
	/*<<<<<<<<<<<<<<<<<<<<<<*/
	//< AlastOut = Obj->Base.Out.AO[0];							duan0830 按照这种写法，模块强制、保持时，会影响模块的正常运算。 将其设计成中间变量

	/*<<<<<中间变量赋值>>>>>*/
	AlastOut = &(Obj->Sta.AlastOut);
	/*<<<<<<<<<<<<<<<<<<<<<<*/

	/**************变量赋值结束************/

	/********************************************/
	/**************算法功能实现开始**************/
	/********************************************/
	if (choose == true)
	{
		Output_Value = AI1;
		if (fabs(Output_Value - AlastOut[0]) / dt > rate1 && rate1 != 0)
			Output_Value = ((Output_Value - AlastOut[0]) > 0) ? (AlastOut[0] + rate1 * dt) : (AlastOut[0] - rate1 * dt);
	}
	else
	{
		Output_Value = AI2;
		if (fabs(Output_Value - AlastOut[0]) / dt > rate2 && rate2 != 0)
			Output_Value = ((Output_Value - AlastOut[0]) > 0) ? (AlastOut[0] + rate2 * dt) : (AlastOut[0] - rate2 * dt);
	}

	AlastOut[0] = Output_Value;
	/********************************************/
	/**************算法功能实现结束**************/
	/********************************************/

	/****************运算结果输出**************/
	AO[0] = Output_Value;
	/**************运算结果输出完毕************/
	return true;
}



//************************************
// Method:    	BCPARA							//< 广播SAMA参数变量函数（无参数需要广播的模块直接将BCPara函数设置为NULL即可）
// Programmer:  duan
// Time:		2019/02/26
// Returns:   	int								//< 成功：返回打包字节个数；失败：返回0
// Parameter: 	Model_Base_t * arg				//< 模块参数结构体指针
// Parameter: 	void ** Data					//< 广播SAMA参数的数据包的指针
//************************************
int BC_PARA(AISEL)(Model_Base_t* arg, void** Data)
{
	NAME(AISEL)* Obj = (NAME(AISEL)*)arg;
	BC_PARA_PUBLIC(Obj);
	return 0;
}



//************************************
// Method:    	BAK_STA							//< 备份SAMA运算中间参数
// Programmer:  duan
// Time:		2019/02/26
// Returns:   	int								//< 成功：返回打包字节个数；失败：返回0
// Parameter: 	Model_Base_t * arg				//< 指定模块类型链表的指针
// Parameter: 	void ** Data					//< 存放数据包当前指针位置的地址
//************************************
int BAK_STA(AISEL)(Model_Base_t* arg, void** Data)
{
	NAME(AISEL)* Obj = (NAME(AISEL)*)arg;
	BAK_STA_PRIVATE(Obj);
	return 0;
}



//************************************
// Method:    	ANA_STA							//< 解析备份的SAMA运算中间参数
// Programmer:  duan
// Time:		2019/02/26
// Returns:   	int								//< 成功：返回解析字节个数；失败：返回0
// Parameter: 	Model_Base_t * arg				//< 模块参数结构体指针
// Parameter: 	void ** Data					//< 存放数据包当前指针位置的地址
//************************************
int ANA_STA(AISEL)(Model_Base_t* arg, void** Data)
{
	NAME(AISEL)* Obj = (NAME(AISEL)*)arg;
	ANA_STA_PRIVATE(Obj);
	return 0;
}



//************************************
// Method:    	CHANGE_PAR				//< 在线修改模块参数函数
// Programmer:  duan
// Time:		2019/02/26
// Returns:   	int						//< 读取字节长度计数值
// Parameter: 	Model_Base_t* arg		//< 指定模块类型链表的指针
// Parameter: 	void** Data				//< 存放数据包当前指针位置的地址
//************************************
int CHANGE_PAR(AISEL)(Model_Base_t* arg, void** Data)
{
	int _iLen = 0;
	MEMREAD(((NAME(AISEL)*)arg)->Par, Data[0]);
	return _iLen;
}



//************************************
// Method:    	INIT_STAPAR						//< 初始化模块运算中间参数
// Programmer:  duan
// Time:		2019/02/26
// Parameter: 	Model_Base_t* arg				//< 模块参数结构体指针
//************************************
void INIT_STAPAR(AISEL)(Model_Base_t* arg)
{
	NAME(AISEL)* name = (NAME(AISEL)*)arg;
	/****************初始化中间变量结构体**************/
	memset(&(name->Sta), 0, sizeof(name->Sta));
	/**************初始化中间变量结构体结束************/

	/****************对中间变量结构体的相关参数进行赋值**************/
	name->Sta.AlastOut = 0;
	/**************对中间变量结构体的相关参数进行赋值结束************/
}
